//
//  ToolQRCode.swift
//  Library_y
//
//  Created by JC on 2023/6/6.
//

import Foundation
import UIKit

public typealias BlockImage = (_ date: UIImage?) -> Void
extension Tools {
    
    // MARK: 二维码生成   size最小：{115, 115}
    static public func createQRForString(qrString: String, qrImageNamed: String? = nil, block: BlockImage? = nil) {
        // 将字符串转换为二进制
        let data = qrString.data(using: String.Encoding.utf8, allowLossyConversion: false)
        let filter = CIFilter(name: "CIQRCodeGenerator")!
        filter.setValue(data, forKey: "inputMessage")
        filter.setValue("H", forKey: "inputCorrectionLevel")
        let qrCIImage = filter.outputImage
        let colorFilter = CIFilter(name: "CIFalseColor")!
        colorFilter.setDefaults()
        colorFilter.setValue(qrCIImage, forKey: "inputImage")
        colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0")
        colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1")

        let codeImage = UIImage(ciImage: colorFilter.outputImage!.transformed(by: CGAffineTransform(scaleX: 5, y: 5)))

        // 内嵌logo
        if qrImageNamed != nil {
            if let iconImage = UIImage(named: qrImageNamed!) {
                let rect = CGRect.init(x: 0, y: 0, width: codeImage.size.width, height: codeImage.size.height)
                UIGraphicsBeginImageContext(rect.size)
                codeImage.draw(in: rect)
                let avatarSize = CGSize.init(width: rect.size.width / 4, height: rect.size.height / 4)
                let x = (rect.width - avatarSize.width) / 2
                let y = (rect.height - avatarSize.height) / 2
                iconImage.draw(in: CGRect(x: x, y: y, width: avatarSize.width, height: avatarSize.height))
                let resultImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
                block?(resultImage)
            }
        }
        block?(codeImage)
    }
    
    /*
     使用了 filter.setValue("H", forKey: "inputCorrectionLevel") 后，二维码图片本身会变的很大。
     inputCorrectionLevel 是一个单字母（@”L”, @”M”, @”Q”, @”H” 中的一个），表示不同级别的容错率，默认为 @”M”.
     QR码有容错能力，QR码图形如果有破损，仍然可以被机器读取内容，最高可以到7%~30%面积破损仍可被读取,相对而言，容错率愈高，QR码图形面积愈大。
     所以一般折衷使用15%容错能力。

     L水平： 7%的字码可被修正.
     M水平： 15%的字码可被修正
     Q水平： 25%的字码可被修正
     H水平： 30%的字码可被修正
     */
}
